package ch07 {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Vector3D;

	/**
	 * 指向某物
	 */
	[SWF(width=800,height=800,backgroundColor=0xffffff)]
	public class FollowMouse3D extends Sprite {
		private var _sprite:Sprite;
		private var _angleX:Number = 0;
		private var _angleY:Number = 0;
		private var _angleZ:Number = 0;

		public function FollowMouse3D(){
			_sprite = new Sprite();
			_sprite.x = 400;
			_sprite.y = 400;
			_sprite.z = 200;
			_sprite.graphics.beginFill(0xff0000);
			_sprite.graphics.moveTo(0, 50);
			_sprite.graphics.lineTo(-25, 25);
			_sprite.graphics.lineTo(-10, 25);
			_sprite.graphics.lineTo(-10, -50);
			_sprite.graphics.lineTo(10, -50);
			_sprite.graphics.lineTo(10, 25);
			_sprite.graphics.lineTo(25, 25);
			_sprite.graphics.lineTo(0, 50);
			_sprite.graphics.endFill();
			addChild(_sprite);

			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void {
			_sprite.x = 400 + Math.sin(_angleX += .11) * 200;
			_sprite.y = 400 + Math.sin(_angleY += .07) * 200;
			_sprite.z = Math.sin(_angleZ += .09) * 200;
			/**
			   pointAt () 方法
			   public function pointAt(pos:Vector3D, at:Vector3D = null, up:Vector3D = null):void
			   旋转显示对象以使其朝向指定的位置。此方法允许对方向进行就地修改。
			   显示对象（即 at Vector3D 对象）的向前方向矢量指向指定的现实世界相关位置。
			   显示对象的向上方向是用 up Vector3D 对象指定的。
			   pointAt() 方法可使缓存的显示对象旋转属性值无效。
			   此方法可分解显示对象的矩阵并修改旋转元素，从而让对象转向指定位置。
			   然后，此方法将重新组成（更新）显示对象的矩阵，这将执行转换。
			   如果该对象指向正在移动的目标（例如正在移动的对象位置），则对于每个后续调用，
			   此方法都会让对象朝正在移动的目标旋转。

			   参数
			   pos:Vector3D — 目标对象的相对于现实世界的位置。相对于现实世界定义了相对于所有对象所在的现实世界空间和坐标的对象转换。
			   at:Vector3D (default = null) — 用于定义显示对象所指向的位置的相对于对象的矢量。相对于对象定义了相对于对象空间（即对象自己的参照帧和坐标系统）的对象转换。默认值为 -z 轴 (0,0,-1)。
			   up:Vector3D (default = null) — 用于为显示对象定义“向上”方向的相对于对象的矢量。如果从上至下绘制对象，则 +z 轴为该对象的“up”矢量。相对于对象定义了相对于对象空间（即对象自己的参照帧和坐标系统）的对象转换。默认值为 -y 轴 (0,-1,0)。
			 */
			_sprite.transform.matrix3D.pointAt(new Vector3D(mouseX, mouseY, 0));
		}
	}
}